﻿using System;
using System.Drawing;
using Vtron.ATSP.DomainObjects;
using Vtron.ATSP.Infrastructure;
using Vtron.ATSP.Projector.Domain;

namespace Vtron.ATSP.Projector
{
    /// <summary>
    /// 投影机通信实体类
    /// </summary>
    /// <remarks>
    ///     <创建人>邓穗捷</创建人>
    ///     <创建时间>2014-08-14</创建时间>
    ///     <修订人></修订人>
    ///     <修订时间></修订时间>
    ///     <修订说明></修订说明>
    /// </remarks>
    public class ProjectorCom : IProjectorCom
    {
        #region Fields

        ISocketHandler socketHandler;

        #endregion

        #region Constructors

        /// <summary>
        /// 无参的构造函数
        /// </summary>
        /// <remarks>
        ///     <创建人>邓穗捷</创建人>
        ///     <创建时间>2014-08-21</创建时间>
        ///     <修订人></修订人>
        ///     <修订时间></修订时间>
        ///     <修订说明></修订说明>
        /// </remarks>
        public ProjectorCom()
            : this(new SocketHandler())
        {
        }

        /// <summary>
        /// 带一个参数的共有构造函数
        /// </summary>
        /// <param name="socketHandler">Socket 消息处理接口</param>
        /// <remarks>
        ///     <创建人>邓穗捷</创建人>
        ///     <创建时间>2014-08-22</创建时间>
        ///     <修订人></修订人>
        ///     <修订时间></修订时间>
        ///     <修订说明></修订说明>
        /// </remarks>
        public ProjectorCom(ISocketHandler socketHandler)
        {
            this.socketHandler = socketHandler;
        }

        #endregion

        /// <summary>
        /// 检查连接
        /// </summary>
        /// <returns>
        /// 是否连接成功 
        ///     true:成功
        ///     false:失败
        /// </returns>
        /// <remarks>
        ///     <创建人>邓穗捷</创建人>
        ///     <创建时间>2014-08-19</创建时间>
        ///     <修订人></修订人>
        ///     <修订时间></修订时间>
        ///     <修订说明></修订说明>
        /// </remarks>
        public bool CheckConnect()
        {
            bool result = false;

            result = socketHandler.Connect(Utils.ProjectorIP, Utils.ProjectorPort);

            return result;
        }

        /// <summary>
        /// 开机
        /// </summary>
        /// <returns>
        /// 开机结果：
        ///     true 成功
        ///     false 失败
        /// </returns>
        /// <remarks>
        ///     <创建人>邓穗捷</创建人>
        ///     <创建时间>2014-08-14</创建时间>
        ///     <修订人></修订人>
        ///     <修订时间></修订时间>
        ///     <修订说明></修订说明>
        /// </remarks>
        public bool Start()
        {
            bool result = false;

            StartAwaitRequest request = new StartAwaitRequest();
            request.MessageId = 0x6014;
            request.DataLenght = 8;
            request.Type = 0;
            request.Broad = 0;

            StartAwaitResponse response = socketHandler.Handle<StartAwaitResponse>(request, Utils.ProjectorIP, Utils.ProjectorPort);
            if (response.MessageId == 0x6015)
            {
                if (response.Result == 0)
                {
                    result = true;
                }
                else if (response.Result == 1)
                {
                    result = false;
                }
                else
                {
                    throw new ATSPException(String.Format("请求开机失败！错误代码：{0}", response.Result));
                }
            }

            return result;
        }

        /// <summary>
        /// 待机
        /// </summary>
        /// <returns>
        /// 待机结果：
        ///     true 成功
        ///     false 失败
        /// </returns>
        /// <remarks>
        ///     <创建人>邓穗捷</创建人>
        ///     <创建时间>2014-08-14</创建时间>
        ///     <修订人></修订人>
        ///     <修订时间></修订时间>
        ///     <修订说明></修订说明>
        /// </remarks>
        public bool Await()
        {
            bool result = false;

            StartAwaitRequest request = new StartAwaitRequest();
            request.MessageId = 0x6014;
            request.DataLenght = 8;
            request.Type = 1;
            request.Broad = 0;

            StartAwaitResponse response = socketHandler.Handle<StartAwaitResponse>(request, Utils.ProjectorIP, Utils.ProjectorPort);
            if (response.MessageId == 0x6015)
            {
                if (response.Result == 0)
                {
                    result = true;
                }
                else if (response.Result == 1)
                {
                    result = false;
                }
                else
                {
                    throw new ATSPException(String.Format("请求待机失败！错误代码：{0}", response.Result));
                }
            }

            return result;
        }

        /// <summary>
        /// 设置桌面
        /// </summary>
        /// <param name="color">颜色</param>
        /// <returns>
        /// 设置桌面结果：
        ///     true 成功
        ///     false 失败
        /// </returns>
        /// <remarks>
        ///     <创建人>邓穗捷</创建人>
        ///     <创建时间>2014-08-19</创建时间>
        ///     <修订人></修订人>
        ///     <修订时间></修订时间>
        ///     <修订说明></修订说明>
        /// </remarks>
        public bool SetDesktop(Color color)
        {
            bool result = false;

            SetDesktopRequest request = new SetDesktopRequest();
            request.MessageId = 0x601a;
            request.DataLenght = 4;
            if (color == Color.Red)
            {
                request.UIId = 8;
            }
            else if (color == Color.Green)
            {
                request.UIId = 9;
            }
            else if (color == Color.Blue)
            {
                request.UIId = 10;
            }
            else if (color == Color.Black)
            {
                request.UIId = 6;
            }
            else if (color == Color.White)
            {
                request.UIId = 7;
            }

            SetDesktopResponse response = socketHandler.Handle<SetDesktopResponse>(request, Utils.ProjectorIP, Utils.ProjectorPort);
            if (response.MessageId == 0x601b)
            {
                if (response.Result == 0)
                {
                    result = true;
                }
                else if (response.Result == 1)
                {
                    result = false;
                }
                else
                {
                    throw new ATSPException(String.Format("设置桌面失败！错误代码：{0}", response.Result));
                }
            }

            return result;
        }

        /// <summary>
        /// 设置DAC
        /// </summary>
        /// <param name="dac">DAC</param>
        /// <returns>
        /// 设置DAC结果：
        ///     true 成功
        ///     false 失败
        /// </returns>
        /// <remarks>
        ///     <创建人>邓穗捷</创建人>
        ///     <创建时间>2014-09-01</创建时间>
        ///     <修订人></修订人>
        ///     <修订时间></修订时间>
        ///     <修订说明></修订说明>
        /// </remarks>
        public bool SetDAC(Dac dac)
        {
            bool result = false;

            SetDACRequest request = new SetDACRequest();
            request.MessageId = 0x66e0;
            request.DataLenght = 6;
            request.RedDAC = dac.RedDAC;
            request.GreenDAC = dac.GreenDAC;
            request.BlueDAC = dac.BlueDAC;

            SetDACResponse response = socketHandler.Handle<SetDACResponse>(request, Utils.ProjectorIP, Utils.ProjectorPort);
            if (response.MessageId == 0x66e1)
            {
                if (response.Result == 0)
                {
                    result = true;
                }
                else if (response.Result == 1)
                {
                    result = false;
                }
                else
                {
                    throw new ATSPException(String.Format("设置DAC失败！错误代码：{0}", response.Result));
                }
            }

            return result;
        }
    }
}
